Micron Document
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
| SparkN0de-git | SparkN0de |
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------


Displaying Raw • Download


meshchatx/src/frontend/js/deviceBattery.js 7a02eae651e4ffbcebd359f86d665d3cf509b5d9 (7a02eae6) Text, 5.67 KB

T8b949e// SPDX-License-Identifier: 0BSD

T8b949e/**
* Host device battery probe for laptops and mobile.
*
* Order: Android bridge, Electron IPC, then Chromium Battery Status API.
* Returns null when the runtime cannot expose battery state.
*/

Tff7b72import Te6edf3AndroidBridge Tff7b72from Ta5d6ff"./rnode/AndroidBridge.js"Tb4b4b4;
Tff7b72import Te6edf3ElectronUtils Tff7b72from Ta5d6ff"./ElectronUtils.js"Tb4b4b4;

T8b949e/**
* @typedef {object} DeviceBatteryStatus
* @property {boolean} supported
* @property {number|null} level Percent 0-100, or null when unknown
* @property {boolean|null} charging
* @property {"android"|"electron"|"web"|null} source
*/

T8b949e/**
* @param {unknown} value
* @param {{ unitFraction?: boolean }} [options]
* @returns {number|null}
*/
Tff7b72export Tff7b72function Te6edf3normalizeBatteryPercentTb4b4b4(Te6edf3valueTb4b4b4, Te6edf3options Tff7b72= Tb4b4b4{Tb4b4b4}Tb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3value Tff7b72== Tff7b72null Tff7b72|| Te6edf3value Tff7b72=== Ta5d6ff""Tb4b4b4) Tb4b4b4{
Tff7b72return Tff7b72nullTb4b4b4;
Tb4b4b4}
Tff7b72const Te6edf3n Tff7b72= Tff7b72typeof Te6edf3value Tff7b72=== Ta5d6ff"number" Tff7b72? Te6edf3value Tff7b72: Tffa657NumberTb4b4b4(Te6edf3valueTb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Tff7b72!Tffa657NumberTb4b4b4.Tffa657isFiniteTb4b4b4(Te6edf3nTb4b4b4)Tb4b4b4) Tb4b4b4{
Tff7b72return Tff7b72nullTb4b4b4;
Tb4b4b4}
Tff7b72const Te6edf3unitFraction Tff7b72= Tffa657BooleanTb4b4b4(Te6edf3optionsTb4b4b4.Te6edf3unitFractionTb4b4b4)Tb4b4b4;
Tff7b72let Te6edf3pctTb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3unitFractionTb4b4b4) Tb4b4b4{
T8b949e// Chromium Battery Status API: 0.0-1.0
Te6edf3pct Tff7b72= Te6edf3n Tff7b72* T79c0ff100Tb4b4b4;
Tb4b4b4} Tff7b72else Tff7b72if Tb4b4b4(Te6edf3n Tff7b72> T79c0ff0 Tff7b72&& Te6edf3n Tff7b72< T79c0ff1Tb4b4b4) Tb4b4b4{
T8b949e// Ambiguous float without an explicit scale: treat as a fraction.
Te6edf3pct Tff7b72= Te6edf3n Tff7b72* T79c0ff100Tb4b4b4;
Tb4b4b4} Tff7b72else Tb4b4b4{
T8b949e// Native bridges report whole percents (including 0, 1, and 100).
Te6edf3pct Tff7b72= Te6edf3nTb4b4b4;
Tb4b4b4}
Tff7b72if Tb4b4b4(Te6edf3pct Tff7b72< T79c0ff0 Tff7b72|| Te6edf3pct Tff7b72> T79c0ff100Tb4b4b4) Tb4b4b4{
Tff7b72return Tff7b72nullTb4b4b4;
Tb4b4b4}
Tff7b72return Tffa657MathTb4b4b4.Te6edf3roundTb4b4b4(Te6edf3pctTb4b4b4)Tb4b4b4;
Tb4b4b4}

T8b949e/**
* @param {unknown} raw
* @param {"android"|"electron"|"web"|null} source
* @returns {DeviceBatteryStatus|null}
*/
Tff7b72export Tff7b72function Te6edf3normalizeBatteryStatusTb4b4b4(Te6edf3rawTb4b4b4, Te6edf3source Tff7b72= Tff7b72nullTb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3raw Tff7b72== Tff7b72null Tff7b72|| Tff7b72typeof Te6edf3raw Tff7b72!== Ta5d6ff"object" Tff7b72|| Tffa657ArrayTb4b4b4.Te6edf3isArrayTb4b4b4(Te6edf3rawTb4b4b4)Tb4b4b4) Tb4b4b4{
Tff7b72return Tff7b72nullTb4b4b4;
Tb4b4b4}
Tff7b72const Te6edf3resolvedSource Tff7b72= Te6edf3source Tff7b72|| Te6edf3rawTb4b4b4.Te6edf3source Tff7b72|| Tff7b72nullTb4b4b4;
Tff7b72const Te6edf3level Tff7b72= Te6edf3normalizeBatteryPercentTb4b4b4(Te6edf3rawTb4b4b4.Te6edf3level Tff7b72?? Te6edf3rawTb4b4b4.Te6edf3percent Tff7b72?? Te6edf3rawTb4b4b4.Te6edf3charge_percent Tff7b72?? Te6edf3rawTb4b4b4.Te6edf3capacityTb4b4b4, Tb4b4b4{
Te6edf3unitFractionTff7b72: Te6edf3resolvedSource Tff7b72=== Ta5d6ff"web"Tb4b4b4,
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Tff7b72let Te6edf3charging Tff7b72= Tff7b72nullTb4b4b4;
Tff7b72if Tb4b4b4(Tff7b72typeof Te6edf3rawTb4b4b4.Te6edf3charging Tff7b72=== Ta5d6ff"boolean"Tb4b4b4) Tb4b4b4{
Te6edf3charging Tff7b72= Te6edf3rawTb4b4b4.Te6edf3chargingTb4b4b4;
Tb4b4b4} Tff7b72else Tff7b72if Tb4b4b4(Te6edf3rawTb4b4b4.Te6edf3charging Tff7b72=== T79c0ff1 Tff7b72|| Te6edf3rawTb4b4b4.Te6edf3charging Tff7b72=== Ta5d6ff"1" Tff7b72|| Te6edf3rawTb4b4b4.Te6edf3charging Tff7b72=== Ta5d6ff"true"Tb4b4b4) Tb4b4b4{
Te6edf3charging Tff7b72= Tff7b72trueTb4b4b4;
Tb4b4b4} Tff7b72else Tff7b72if Tb4b4b4(Te6edf3rawTb4b4b4.Te6edf3charging Tff7b72=== T79c0ff0 Tff7b72|| Te6edf3rawTb4b4b4.Te6edf3charging Tff7b72=== Ta5d6ff"0" Tff7b72|| Te6edf3rawTb4b4b4.Te6edf3charging Tff7b72=== Ta5d6ff"false"Tb4b4b4) Tb4b4b4{
Te6edf3charging Tff7b72= Tff7b72falseTb4b4b4;
Tb4b4b4} Tff7b72else Tff7b72if Tb4b4b4(Tff7b72typeof Te6edf3rawTb4b4b4.Te6edf3on_battery Tff7b72=== Ta5d6ff"boolean"Tb4b4b4) Tb4b4b4{
Te6edf3charging Tff7b72= Tff7b72!Te6edf3rawTb4b4b4.Te6edf3on_batteryTb4b4b4;
Tb4b4b4} Tff7b72else Tff7b72if Tb4b4b4(Tff7b72typeof Te6edf3rawTb4b4b4.Te6edf3is_charging Tff7b72=== Ta5d6ff"boolean"Tb4b4b4) Tb4b4b4{
Te6edf3charging Tff7b72= Te6edf3rawTb4b4b4.Te6edf3is_chargingTb4b4b4;
Tb4b4b4}
Tff7b72if Tb4b4b4(Te6edf3level Tff7b72== Tff7b72null Tff7b72&& Te6edf3charging Tff7b72== Tff7b72nullTb4b4b4) Tb4b4b4{
Tff7b72return Tff7b72nullTb4b4b4;
Tb4b4b4}
Tff7b72return Tb4b4b4{
Te6edf3supportedTff7b72: Tff7b72trueTb4b4b4,
Te6edf3levelTb4b4b4,
Te6edf3chargingTb4b4b4,
Te6edf3sourceTff7b72: Te6edf3resolvedSourceTb4b4b4,
Tb4b4b4}Tb4b4b4;
Tb4b4b4}

T8b949e/**
* @param {string|object|null|undefined} payload
* @returns {DeviceBatteryStatus|null}
*/
Tff7b72export Tff7b72function Te6edf3parseAndroidBatteryPayloadTb4b4b4(Te6edf3payloadTb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3payload Tff7b72== Tff7b72null Tff7b72|| Te6edf3payload Tff7b72=== Ta5d6ff""Tb4b4b4) Tb4b4b4{
Tff7b72return Tff7b72nullTb4b4b4;
Tb4b4b4}
Tff7b72let Te6edf3raw Tff7b72= Te6edf3payloadTb4b4b4;
Tff7b72if Tb4b4b4(Tff7b72typeof Te6edf3payload Tff7b72=== Ta5d6ff"string"Tb4b4b4) Tb4b4b4{
Tff7b72try Tb4b4b4{
Te6edf3raw Tff7b72= Tffa657JSONTb4b4b4.Te6edf3parseTb4b4b4(Te6edf3payloadTb4b4b4)Tb4b4b4;
Tb4b4b4} Tff7b72catch Tb4b4b4{
Tff7b72return Tff7b72nullTb4b4b4;
Tb4b4b4}
Tb4b4b4}
Tff7b72return Te6edf3normalizeBatteryStatusTb4b4b4(Te6edf3rawTb4b4b4, Ta5d6ff"android"Tb4b4b4)Tb4b4b4;
Tb4b4b4}

T8b949e/**
* @returns {Promise<DeviceBatteryStatus|null>}
*/
Tff7b72async Tff7b72function Te6edf3probeAndroidBatteryTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72try Tb4b4b4{
Tff7b72const Te6edf3bridge Tff7b72= Tff7b72new Te6edf3AndroidBridgeTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Tff7b72!Te6edf3bridgeTb4b4b4.Te6edf3isAvailableTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4{
Tff7b72return Tff7b72nullTb4b4b4;
Tb4b4b4}
Tff7b72const Te6edf3payload Tff7b72= Te6edf3bridgeTb4b4b4.Te6edf3getBatteryStatusTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72return Te6edf3parseAndroidBatteryPayloadTb4b4b4(Te6edf3payloadTb4b4b4)Tb4b4b4;
Tb4b4b4} Tff7b72catch Tb4b4b4{
Tff7b72return Tff7b72nullTb4b4b4;
Tb4b4b4}
Tb4b4b4}

T8b949e/**
* @returns {Promise<DeviceBatteryStatus|null>}
*/
Tff7b72async Tff7b72function Te6edf3probeElectronBatteryTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Tff7b72!Te6edf3ElectronUtilsTb4b4b4.Te6edf3isElectronTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4{
Tff7b72return Tff7b72nullTb4b4b4;
Tb4b4b4}
Tff7b72try Tb4b4b4{
Tff7b72const Te6edf3raw Tff7b72= Tff7b72await Te6edf3ElectronUtilsTb4b4b4.Te6edf3getBatteryStatusTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72return Te6edf3normalizeBatteryStatusTb4b4b4(Te6edf3rawTb4b4b4, Ta5d6ff"electron"Tb4b4b4)Tb4b4b4;
Tb4b4b4} Tff7b72catch Tb4b4b4{
Tff7b72return Tff7b72nullTb4b4b4;
Tb4b4b4}
Tb4b4b4}

T8b949e/**
* @returns {Promise<DeviceBatteryStatus|null>}
*/
Tff7b72async Tff7b72function Te6edf3probeWebBatteryTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Tff7b72typeof Te6edf3navigator Tff7b72=== Ta5d6ff"undefined" Tff7b72|| Tff7b72typeof Te6edf3navigatorTb4b4b4.Te6edf3getBattery Tff7b72!== Ta5d6ff"function"Tb4b4b4) Tb4b4b4{
Tff7b72return Tff7b72nullTb4b4b4;
Tb4b4b4}
Tff7b72try Tb4b4b4{
Tff7b72const Te6edf3battery Tff7b72= Tff7b72await Te6edf3navigatorTb4b4b4.Te6edf3getBatteryTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Tff7b72!Te6edf3batteryTb4b4b4) Tb4b4b4{
Tff7b72return Tff7b72nullTb4b4b4;
Tb4b4b4}
Tff7b72return Te6edf3normalizeBatteryStatusTb4b4b4(
Tb4b4b4{
Te6edf3levelTff7b72: Te6edf3batteryTb4b4b4.Te6edf3levelTb4b4b4,
Te6edf3chargingTff7b72: Te6edf3batteryTb4b4b4.Te6edf3chargingTb4b4b4,
Tb4b4b4}Tb4b4b4,
Ta5d6ff"web"
Tb4b4b4)Tb4b4b4;
Tb4b4b4} Tff7b72catch Tb4b4b4{
Tff7b72return Tff7b72nullTb4b4b4;
Tb4b4b4}
Tb4b4b4}

T8b949e/**
* Read current host battery status when the platform supports it.
*
* @returns {Promise<DeviceBatteryStatus|null>}
*/
Tff7b72export Tff7b72async Tff7b72function Te6edf3getDeviceBatteryStatusTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72const Te6edf3androidStatus Tff7b72= Tff7b72await Te6edf3probeAndroidBatteryTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3androidStatusTb4b4b4) Tb4b4b4{
Tff7b72return Te6edf3androidStatusTb4b4b4;
Tb4b4b4}
Tff7b72const Te6edf3electronStatus Tff7b72= Tff7b72await Te6edf3probeElectronBatteryTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3electronStatusTb4b4b4) Tb4b4b4{
Tff7b72return Te6edf3electronStatusTb4b4b4;
Tb4b4b4}
Tff7b72return Te6edf3probeWebBatteryTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4}

T8b949e/**
* Material icon name for a battery reading.
*
* @param {DeviceBatteryStatus|null|undefined} status
* @returns {string}
*/
Tff7b72export Tff7b72function Te6edf3batteryStatusIconNameTb4b4b4(Te6edf3statusTb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Tff7b72!Te6edf3status Tff7b72|| Tff7b72!Te6edf3statusTb4b4b4.Te6edf3supportedTb4b4b4) Tb4b4b4{
Tff7b72return Ta5d6ff"battery-unknown"Tb4b4b4;
Tb4b4b4}
Tff7b72if Tb4b4b4(Te6edf3statusTb4b4b4.Te6edf3chargingTb4b4b4) Tb4b4b4{
Tff7b72return Ta5d6ff"battery-charging"Tb4b4b4;
Tb4b4b4}
Tff7b72const Te6edf3level Tff7b72= Te6edf3statusTb4b4b4.Te6edf3levelTb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3level Tff7b72== Tff7b72nullTb4b4b4) Tb4b4b4{
Tff7b72return Ta5d6ff"battery"Tb4b4b4;
Tb4b4b4}
Tff7b72if Tb4b4b4(Te6edf3level Tff7b72<= T79c0ff15Tb4b4b4) Tb4b4b4{
Tff7b72return Ta5d6ff"battery-alert"Tb4b4b4;
Tb4b4b4}
Tff7b72if Tb4b4b4(Te6edf3level Tff7b72<= T79c0ff30Tb4b4b4) Tb4b4b4{
Tff7b72return Ta5d6ff"battery-low"Tb4b4b4;
Tb4b4b4}
Tff7b72if Tb4b4b4(Te6edf3level Tff7b72>= T79c0ff90Tb4b4b4) Tb4b4b4{
Tff7b72return Ta5d6ff"battery"Tb4b4b4;
Tb4b4b4}
Tff7b72return Ta5d6ff"battery-medium"Tb4b4b4;
Tb4b4b4}

T8b949e/**
* Whether the header chip should be visible.
*
* @param {DeviceBatteryStatus|null|undefined} status
* @returns {boolean}
*/
Tff7b72export Tff7b72function Te6edf3shouldShowBatteryChipTb4b4b4(Te6edf3statusTb4b4b4) Tb4b4b4{
Tff7b72return Tffa657BooleanTb4b4b4(Te6edf3status Tff7b72&& Te6edf3statusTb4b4b4.Te6edf3supported Tff7b72&& Te6edf3statusTb4b4b4.Te6edf3level Tff7b72!= Tff7b72nullTb4b4b4)Tb4b4b4;
Tb4b4b4}


──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────